home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 21 / AACD 21.iso / AACD / Games / JST / sources / jst / jst.i < prev    next >
Encoding:
Text File  |  2001-03-19  |  21.5 KB  |  1,149 lines

  1.     IFND    JST_I_INCLUDED
  2. JST_I_INCLUDED    =    1
  3.  
  4.         IFD    BARFLY
  5. ;;;        BOPT    O+ OG+            ;enable optimizing
  6.         BOPT    ODd- ODe-        ;disable mul optimizing
  7.         BOPT    w4-            ;disable 64k warnings
  8.         BOPT    wo-            ;disable optimizer warnings
  9.         SUPER                ;disable supervisor warnings
  10.         ENDC
  11.  
  12.  
  13.     include    "gp_macros.i"
  14.  
  15.     IFD    WHDLOADSLAVE
  16.     include    "osemu.i"
  17.     include    "own/whdload.i"
  18.     include    "own/whdmacros.i"
  19.     ENDC
  20.  
  21.     IFND    REDEFINED_REGISTERS
  22. REDEFINED_REGISTERS = 1
  23. Ax EQUR A5
  24. Ay EQUR A6
  25.     ENDC
  26.  
  27. ; wait for blitter operations to finish
  28. ; simple but effective
  29.  
  30. WAIT_BLIT:MACRO
  31. .wait\@
  32.     tst.b    $BFE001
  33.     BTST    #6,dmaconr+$DFF000
  34.     BNE.B    .wait\@
  35.     ENDM
  36.  
  37. ; save local variables
  38.  
  39. SET_VARZONE:MACRO
  40.     IFNE    NARG-2
  41.         FAIL    arguments "SET_VARZONE"
  42.     ENDC
  43.     STORE_REGS
  44.     lea    \1(pc),A0
  45.     lea    \2(pc),A1
  46.     JSRABS    SetLocalVarZone
  47.     RESTORE_REGS
  48.     ENDM
  49.  
  50. ; wait using Vertical beam delay (thanks to Harry for the routine)
  51.  
  52. BEAM_DELAY:MACRO
  53.     IFNE    NARG-1
  54.         FAIL    arguments "BEAM_DELAY"
  55.     ENDC
  56.  
  57.     move.w  d0,-(a7)
  58.     move.w    \1,D0
  59.     beq.b    .exit\@        ; don't wait
  60.  
  61. .loop1\@
  62.     move.w  d0,-(a7)
  63.         move.b    $dff006,d0    ; VPOS
  64.  
  65. .loop2\@
  66.     cmp.b    $dff006,d0
  67.     beq.s    .loop2\@
  68.     move.w    (a7)+,d0
  69.     dbf    d0,.loop1\@
  70.  
  71. .exit\@
  72.     move.w    (a7)+,d0
  73.     ENDM
  74.  
  75. ; jump to relocatable JST routine
  76.  
  77. JSRGEN:MACRO
  78.     IFNE    NARG-1
  79.         FAIL    arguments "JSRGEN"
  80.     ENDC
  81.  
  82.     IFD    WHDLOADSLAVE
  83. ;-------------------------------------
  84.     IFC    \1,'InGameExit'
  85.     pea    TDREASON_OK
  86.     move.l    (_resload,pc),-(a7)
  87.     add.l    #resload_Abort,(a7)
  88.     rts
  89.     MEXIT
  90.     ENDC    
  91. ;-------------------------------------
  92.     IFC    \1,'FlushCachesHard'
  93.     move.l    a0,-(A7)
  94.     move.l    _resload(PC),a0
  95.     jsr    resload_FlushCache(A0)    ;preserves all registers
  96.     move.l    (A7)+,a0
  97.     MEXIT
  98.     ENDC    
  99. ;-------------------------------------
  100.     IFC    \1,'PatchExceptions'
  101.                 ;ignored atm
  102.     MEXIT
  103.     ENDC    
  104. ;-------------------------------------
  105.     IFC    \1,'StoreCopperPointer'
  106.                 ;ignored atm
  107.     MEXIT
  108.     ENDC    
  109. ;-------------------------------------
  110.     IFC    \1,'TellCopperPointer'
  111.                 ;ignored atm
  112.     MEXIT
  113.     ENDC    
  114. ;-------------------------------------
  115.     IFC    \1,'RNCDecrunch'
  116.                 ;ignored atm
  117.     movem.l    A2,-(A7)
  118.     MOVE.L    _resload(PC),A2
  119.     JSR    (resload_Decrunch,a2)
  120.     movem.l    (A7)+,A2
  121.     MEXIT
  122.     ENDC    
  123. ;-------------------------------------
  124.     IFC    \1,'InGameIconify'
  125.                 ;ignored atm
  126.     MEXIT
  127.     ENDC    
  128. ;-------------------------------------
  129.     IFC    \1,'FreezeAll'
  130.     move.w    #$7fff,$dff09a
  131.     move.w    #$7fff,$dff096
  132.     MEXIT
  133.     ENDC    
  134. ;-------------------------------------
  135.     IFC    \1,'GoECS'
  136.     move.w    #$0c20,$dff106
  137.     move.w    #0,$dff1fc
  138.     MEXIT
  139.     ENDC    
  140. ;-------------------------------------
  141.     IFC    \1,'BeamDelay'
  142. .bd_loop1\@
  143.     move.w  d0,-(a7)
  144.         move.b    $dff006,d0    ; VPOS
  145. .bd_loop2\@
  146.     cmp.b    $dff006,d0
  147.     beq.s    .bd_loop2\@
  148.     move.w    (a7)+,d0
  149.     dbf    d0,.bd_loop1\@
  150.     MEXIT
  151.     ENDC    
  152. ;-------------------------------------
  153.     IFC    \1,'WaitMouse'
  154. .waitmousem_\@
  155.     move.w    $dff006,$dff180
  156.     btst    #6,$bfe001
  157.     bne.s    .waitmousem_\@
  158.     MEXIT
  159.     ENDC    
  160. ;-------------------------------------
  161.     IFC    \1,'WaitReturn'
  162. .waitmousem_\@
  163.     move.w    $dff006,$dff180
  164.     btst    #6,$bfe001
  165.     bne.s    .waitmousem_\@
  166.     MEXIT
  167.     ENDC    
  168. ;-------------------------------------
  169.     IFC    \1,'SetDisk'
  170.                 ;ignored atm
  171.     MEXIT
  172.     ENDC    
  173. ;-------------------------------------
  174.     IFC    \1,'InitTrackDisk'
  175.  
  176.     IFND    WHDM_INITTRACKDISK_CALLED
  177. WHDM_INITTRACKDISK_CALLED EQU 1
  178.     bra.s    .whdm_itd1\@
  179. .whdm_id_table\@
  180. WHDM_INITTRACKDISK_TABLE EQU .whdm_id_table\@
  181.     DC.L    0,0,0,0,0,0,0,0,0,0,0,0
  182. .whdm_itd1\@
  183.     ENDC
  184.  
  185.     lea.l    WHDM_INITTRACKDISK_TABLE(PC),A1
  186.     MEXIT
  187.     ENDC    
  188. ;-------------------------------------
  189.     IFC    \1,'TrackLoad'
  190.     movem.l    d0-d1/a0-a2,-(A7)
  191.     cmp.w    #2,$1c(A1)
  192.     beq.s    .whdm_trackload1\@
  193.     illegal
  194. .whdm_trackload1\@
  195.     move.l    $24(A1),d0
  196.     move.l    $2c(A1),d1
  197.     move.l    $28(A1),a1
  198.     lea.l    HDP_FnameDiskNo(PC),a0
  199.     move.b    #$31,(A0)        ;only disk 0 atm
  200.     lea.l    HDP_FnameStart(PC),a0
  201.     MOVE.L    _resload(PC),A2
  202.     JSR    (resload_LoadFileOffset,a2)
  203.     movem.l    (A7)+,d0-d1/a0-a2
  204.     move.b    #0,$1f(A1)        ;no error
  205.     MEXIT
  206.     ENDC    
  207. ;-------------------------------------
  208.     IFC    \1,'HexReplaceLong'
  209.     STORE_REGS    A0-A1/D0-D1
  210. .srch\@
  211.     cmp.l    (A0),D0
  212.     beq.b    .found\@
  213. .next\@
  214.     addq.l    #2,A0
  215.     cmp.l    A1,A0
  216.     bcc.b    .exit\@
  217.     bra.b    .srch\@
  218. .found\@
  219.     move.l    D1,(A0)+
  220.     bra    .next\@
  221. .exit\@
  222.     RESTORE_REGS    A0-A1/D0-D1
  223.     MEXIT
  224.     ENDC
  225. ;-------------------------------------
  226.     IFC    \1,'HexSearch'
  227.     movem.l    D1/D3/A1-A2,-(A7)
  228. .addrloop\@:
  229.     moveq.l    #0,D3
  230. .strloop\@:
  231.     move.b    (A0,D3.L),D1    ; gets byte
  232.     cmp.b    (A2,D3.L),D1    ; compares it to the user string
  233.     bne.b    .notok\@        ; nope
  234.     addq.l    #1,D3
  235.     cmp.l    D0,D3
  236.     bcs.b    .strloop\@
  237.  
  238.     ; pattern was entirely found!
  239.  
  240.     bra.b    .exit\@
  241. .notok\@:
  242.     addq.l    #1,A0    ; next byte please
  243.     cmp.l    A0,A1
  244.     bcc.b    .addrloop\@    ; end?
  245.     sub.l    A0,A0
  246. .exit\@:
  247.     movem.l    (A7)+,D1/D3/A1-A2
  248.     MEXIT
  249.     ENDC
  250. ;-------------------------------------
  251.     IFC    \1,'ReadRobSectors'
  252.     movem.l    d1-d2/a0-a2,-(A7)
  253.     tst.w    d3
  254.     beq.s    .whdm_rrs_load1\@
  255.     cmp.w    #$8000,d3
  256.     beq.s    .whdm_rrs_load1\@
  257.     illegal                ;doesnt save yet
  258. .whdm_rrs_load1\@
  259.     swap    D1
  260.     clr.w    D1
  261.     swap    D1
  262.     swap    D2
  263.     clr.w    D2
  264.     swap    D2
  265.     tst.w    D2
  266.     beq.b    .exit\@        ; length=0: out
  267.  
  268.     move.l    a0,a1            ;address
  269.     lea.l    HDP_FnameDiskNo(PC),a0
  270.     add.b    #$31,d0            ;only up to 9 disks
  271.     move.b    d0,(A0)
  272.     lea.l    HDP_FnameStart(PC),a0
  273.  
  274.     move.l    D2,D0            ;len to read
  275.     ext.l    d0
  276.     lsl.l    #7,d0
  277.     lsl.l    #2,d0
  278.     ext.l    d1
  279.     lsl.l    #7,d1            ;diskoffset
  280.     lsl.l    #2,d1
  281.     MOVE.L    _resload(PC),A2
  282.     JSR    (resload_LoadFileOffset,a2)
  283. .exit\@
  284.     movem.l    (A7)+,d1-d2/a0-a2
  285.     not.l    d0        ;KNOWN BUG: RETURNCODE UNSET!
  286.     MEXIT
  287.     ENDC    
  288. ;-------------------------------------
  289.     IFC    \1,'ReadDiskPart'
  290.     movem.l    d1/a0-a2,-(A7)
  291.     move.l    a0,a1            ;address
  292.     lea.l    HDP_FnameDiskNo(PC),a0
  293.     add.b    #$31,d0            ;only up to 9 disks
  294.     move.b    d0,(A0)
  295.     lea.l    HDP_FnameStart(PC),a0
  296.     move.l    D1,D0            ;len to read
  297.     move.l    d2,d1
  298.     MOVE.L    _resload(PC),A2
  299.     JSR    (resload_LoadFileOffset,a2)
  300.     movem.l    (A7)+,d1/a0-a2
  301.     not.l    d0        ;KNOWN BUG: RETURNCODE UNSET!
  302.     MEXIT
  303.     ENDC    
  304. ;-------------------------------------
  305.     IFC    \1,'ReadFile'
  306.                     ;ignores command (d0)
  307.     movem.l    d1/a0-a2,-(A7)
  308.     MOVE.L    _resload(PC),A2
  309.     JSR    (resload_GetFileSize,a2)
  310.     movem.l    (A7),d1/a0/a1
  311.     cmp.l    d0,d1
  312.     bls.s    .whdm_loadfile\@
  313.     move.l    d0,d1
  314.     move.l    d1,(A7)
  315. .whdm_loadfile\@
  316.     MOVE.L    D1,D0            ;len to read
  317.     MOVEQ.L    #0,D1            ;start with begin of file
  318.     ;name and address match jst-function
  319.     JSR    (resload_LoadFileOffset,a2)
  320.     movem.l    (A7)+,d1/a0-a2
  321.     not.l    d0
  322.             ;result: D0=0 if success, d1-len if success
  323.     MEXIT
  324.     ENDC    
  325. ;-------------------------------------
  326.     IFC    \1,'StrlenAsm'
  327.     movem.l    A0,-(A7)
  328.     move.l    D0,A0
  329.     clr.l    D0
  330. .loop\@: 
  331.     tst.b    (A0,D0.L)
  332.     beq.b    .exit\@
  333.     addq.l    #1,D0
  334.     bra.b    .loop\@
  335. .exit\@:
  336.     movem.l    (A7)+,A0
  337.     MEXIT
  338.     ENDC    
  339. ;-------------------------------------
  340.     IFC    \1,'ReadUserFileHD'
  341.                     ;ignores command (d0)
  342.     movem.l    d1/a0-a2,-(A7)
  343.     MOVE.L    _resload(PC),A2
  344.     JSR    (resload_GetFileSize,a2)
  345.     movem.l    (A7),d1/a0/a1
  346.     cmp.l    d0,d1
  347.     bls.s    .whdm_loadfile\@
  348.     move.l    d0,d1
  349.     move.l    d1,(A7)
  350. .whdm_loadfile\@
  351.     MOVE.L    D1,D0            ;len to read
  352.     MOVEQ.L    #0,D1            ;start with begin of file
  353.     ;name and address match jst-function
  354.     JSR    (resload_LoadFileOffset,a2)
  355.     movem.l    (A7)+,d1/a0-a2
  356.     not.l    d0
  357.             ;result: D0=0 if success, d1-len if success
  358.     MEXIT
  359.     ENDC    
  360. ;-------------------------------------
  361.     IFC    \1,'WriteUserFileHD'
  362.                     ;ignores command (d0)
  363.     movem.l    d1/a0-a2,-(A7)
  364.     MOVE.L    _resload(PC),A2
  365.     MOVE.L    D1,D0            ;len to save
  366.     MOVEQ.L    #0,D1            ;start with begin of file
  367.     ;name and address match jst-function
  368.     JSR    (resload_SaveFileOffset,a2)
  369.     movem.l    (A7)+,d1/a0-a2
  370.     not.l    d0
  371.             ;result: D0=0 if success, d1-len if success
  372.     MEXIT
  373.     ENDC    
  374. ;-------------------------------------
  375.     IFC    \1,'StrcmpAsm'
  376.     movem.l    d1/a0-a2,-(A7)
  377.     move.l    d0,a0
  378.     move.l    d1,a1
  379. .contstrcmpasm\@
  380.     move.b    (A0)+,d0
  381.     beq.s    .termstrcmpasm\@
  382.     move.b    (A1)+,d1
  383.     beq.s    .failstrcmpasm\@
  384.     bsr.s    .letterstrcmpasm\@
  385.     exg    d0,d1
  386.     bsr.s    .letterstrcmpasm\@
  387.     cmp.b    d0,d1
  388.     bne.s    .failstrcmpasm\@
  389.     bra.s    .contstrcmpasm\@
  390.  
  391. .termstrcmpasm\@
  392.     tst.b    (A1)+
  393.     bne.s    .failstrcmpasm\@
  394.     moveq.l    #0,d0
  395.     bra.s    .endstrcmpasm\@
  396.  
  397. .letterstrcmpasm\@
  398.     cmp.b    #$60,d0
  399.     bls.s    .letter1strcmpasm\@
  400.     cmp.b    #$7a,d0
  401.     bhi.s    .letter1strcmpasm\@
  402.     sub.b    #$20,d0
  403. .letter1strcmpasm\@
  404.     rts
  405.  
  406. .failstrcmpasm\@
  407.     moveq.l    #-1,d0
  408. .endstrcmpasm\@
  409.     movem.l    (A7)+,d1/a0-a2
  410.     MEXIT
  411.     ENDC    
  412. ;-------------------------------------
  413.     FAIL    'JSRGEN-WHDLOAD'
  414.     ELSE
  415.  
  416.     PEA    .END_JSRGEN\@(PC)
  417.  
  418.     MOVE.L    RelTable(PC),-(A7)
  419.     ADD.L    #RelOff_\1,(A7)
  420.  
  421.     MOVE.L    A0,-(A7)
  422.     MOVE.L    4(A7),A0
  423.     MOVE.L    (A0),4(A7)
  424.  
  425.     MOVE.L    (A7)+,A0
  426.     RTS
  427.  
  428. .END_JSRGEN\@
  429.     ENDC
  430.     ENDM
  431.  
  432. ; jump to relocatable JST routine, with interrupts disabled
  433.  
  434. JSRGEN_FREEZE:MACRO
  435.     IFNE    NARG-1
  436.         FAIL    arguments "JSRGEN_FREEZE"
  437.     ENDC
  438.     move.w    SR,-(A7)
  439.     move.w    #$2700,SR    ; freeze, bastard
  440.     JSRGEN    \1
  441.     move.w    (A7)+,SR
  442.     ENDM
  443.  
  444. ; jump to absolute JST routines (only when OS is active!!)
  445.  
  446. JSRABS:MACRO
  447.     IFNE    NARG-1
  448.         FAIL    arguments "JSRABS"
  449.     ENDC
  450.  
  451.     IFD    WHDLOADSLAVE
  452. ;-------------------------------------
  453.     IFC    \1,'Display'
  454.                 ;ignore display
  455.     MEXIT
  456.     ENDC    
  457. ;-------------------------------------
  458.     IFC    \1,'NewLine'
  459.                 ;ignore newline
  460.     MEXIT
  461.     ENDC    
  462. ;-------------------------------------
  463.     IFC    \1,'UseHarryOSEmu'
  464. OSEMU_BASE=$400
  465.     lea    .osemuname\@(pc),a0
  466.     lea    OSEMU_BASE,a1
  467.     move.l    (_resload,pc),a2
  468.     jsr    (resload_LoadFileDecrunch,a2)    ;this allows to
  469.                         ;compress the osemu
  470.     move.l    (_resload,pc),a0    ;the resload base
  471.     lea    (_whdinit_base,pc),a1        ;the slave structure
  472.  
  473. ; Jeff: problems with expansion mem ATM
  474. ;    move.l    (ws_ExpMem,A1),(OSEMU_BASE+OSM_EXPMEM)
  475. ;    beq.b    .nofast\@
  476. ;    move.l    #FASTMEMSIZE,(OSEMU_BASE+OSM_EXPSIZE)
  477. ;    move.l    (ws_ExpMem,A1),A2
  478. ;    moveq.l    #0,D0
  479. ;.clrfast\@:            ; clear fastmem if present
  480. ;    clr.l    (A2)+
  481. ;    addq.l    #4,D0
  482. ;    cmp.l    #FASTMEMSIZE,D0
  483. ;    bcs.b    .clrfast\@
  484. ;.nofast\@
  485.  
  486.     jsr    OSEMU_BASE
  487.     
  488.     sub.l    A2,A2
  489.     sub.l    A3,A3
  490.     sub.l    A4,A4
  491.     sub.l    A5,A5
  492.     moveq.l    #0,D0
  493.     moveq.l    #0,D1
  494.     moveq.l    #0,D2
  495.     moveq.l    #0,D3
  496.     moveq.l    #0,D4
  497.     moveq.l    #0,D5
  498.     moveq.l    #0,D6
  499.     moveq.l    #0,D7
  500.     bra.b    .out\@
  501. .osemuname\@:
  502.     dc.b    "OSEmu.400",0
  503.     even
  504. .out\@
  505.     MEXIT
  506.     ENDC
  507. ;-------------------------------------
  508.     IFC    \1,'LoadSmallFiles'
  509.                 ;ignore LoadSmallFiles (whdload uses preload)
  510.     MEXIT
  511.     ENDC    
  512. ;-------------------------------------
  513.     IFC    \1,'LoadFiles'
  514.                 ;ignore LoadFiles (whdload uses preload)
  515.     MEXIT
  516.     ENDC    
  517. ;-------------------------------------
  518.     IFC    \1,'Degrade'
  519.     IFD    WHDM_DEGRADE_CALLED
  520.     FAIL    'Degrade called twice'
  521.     ENDC
  522. WHDM_DEGRADE_CALLED SET    1
  523.                 ;map Degrade on SetCACR
  524.     movem.l    d0-d1/a0-a2,-(A7)
  525.     move.l    _resload(PC),a2
  526.     and.l    #CACRF_EnableI|CACRF_EnableD,d0    ;mask bits allowed in whdload
  527.     and.l    #CACRF_EnableI|CACRF_EnableD,d1    ;mask bits allowed in whdload
  528.     jsr    (resload_SetCACR,a2)
  529.     movem.l    (A7)+,d0-d1/a0-a2
  530.  
  531.     MEXIT
  532.     ENDC    
  533. ;-------------------------------------
  534.     IFC    \1,'SupervisorMode'
  535.     IFD    WHDM_SUPERVISORMODE_CALLED
  536.     FAIL    'SupervisorMode called twice'
  537.     ENDC
  538. WHDM_SUPERVISORMODE_CALLED SET    1
  539.                 ;ignore SupervisorMode once
  540.     MEXIT
  541.     ENDC    
  542. ;-------------------------------------
  543.     IFC    \1,'SaveOSData'
  544.     IFD    WHDM_SAVEOSDATA_CALLED
  545.     FAIL    'SaveOSData called twice'
  546.     ENDC
  547. WHDM_SAVEOSDATA_CALLED SET    1
  548.                 ;ignore SaveOSData once
  549.     MEXIT
  550.     ENDC    
  551. ;-------------------------------------
  552.     IFC    \1,'SetLocalVarZone'
  553.                 ;ignored atm
  554.     MEXIT
  555.     ENDC    
  556. ;-------------------------------------
  557.     IFC    \1,'AllocExtMem'
  558.     IFD    WHDM_ALLOCEXTMEM_CALLED
  559.     FAIL    'AllocExtMem called twice'
  560.     ENDC
  561. WHDM_ALLOCEXTMEM_CALLED SET    1
  562.     cmp.l    #FASTMEMSIZE,D0
  563.     beq.s    .whdm_allocextmem1\@
  564.     illegal
  565. .whdm_allocextmem1\@
  566.     move.l    _whd_fmemaddr(PC),d0
  567.     MEXIT
  568.     ENDC    
  569. ;-------------------------------------
  570.     IFC    \1,'Alloc24BitMem'
  571.     IFD    WHDM_ALLOCEXTMEM_CALLED
  572.     FAIL    'Alloc24BitMem called twice'
  573.     ENDC
  574. WHDM_ALLOCEXTMEM_CALLED SET    1
  575.     cmp.l    #FAKEFMEMSIZE,D0
  576.     beq.s    .whdm_alloc24bitmem1\@
  577.     illegal
  578. .whdm_alloc24bitmem1\@
  579.     move.l    #CHIPMEMSIZE,d0
  580.     MEXIT
  581.     ENDC    
  582. ;-------------------------------------
  583.     IFC    \1,'CloseAll'
  584.     pea    TDREASON_DEBUG
  585.     move.l    (_resload,pc),-(a7)
  586.     add.l    #resload_Abort,(a7)
  587.     rts
  588.     MEXIT
  589.     ENDC    
  590. ;-------------------------------------
  591.     IFC    \1,'TestFile'
  592.     movem.l    d1/a0-a2,-(A7)
  593.     move.l    _resload(PC),a2
  594.     move.l    d0,a0
  595.     jsr    (resload_GetFileSize,a2)
  596.     movem.l    (A7)+,d1/a0-a2
  597.     tst.l    d0
  598.     bne.s    .whdm_testfile1\@
  599.     moveq.l    #-1,d0
  600.     bra.s    .whdm_testfile2\@
  601.  
  602. .whdm_testfile1\@
  603.     moveq.l    #0,d0
  604. .whdm_testfile2\@
  605.     MEXIT
  606.     ENDC    
  607. ;-------------------------------------
  608.     IFC    \1,'LoadDisks'
  609.                 ;ignore loaddisks
  610.     MEXIT
  611.     ENDC    
  612. ;-------------------------------------
  613.     IFC    \1,'WaitMouse'
  614. .waitmousem_\@
  615.     move.w    $dff006,$dff180
  616.     btst    #6,$bfe001
  617.     bne.s    .waitmousem_\@
  618.     MEXIT
  619.     ENDC    
  620. ;-------------------------------------
  621.     IFC    \1,'WaitReturn'
  622. .waitmousem_\@
  623.     move.w    $dff006,$dff180
  624.     btst    #6,$bfe001
  625.     bne.s    .waitmousem_\@
  626.     MEXIT
  627.     ENDC    
  628. ;-------------------------------------
  629.                 ;unsupported functions cause errors
  630.     FAIL    'JSRABS-WHDLOAD'
  631.         ;end whdload-part
  632.     ELSE
  633.  
  634.  
  635.     PEA    .END_JSRABS\@(PC)
  636.  
  637.     MOVE.L    AbsTable(PC),-(A7)
  638.     ADD.L    #AbsOff_\1,(A7)
  639.  
  640.     MOVE.L    A0,-(A7)
  641.     MOVE.L    4(A7),A0
  642.     MOVE.L    (A0),4(A7)
  643.  
  644.     MOVE.L    (A7)+,A0
  645.     RTS
  646.  
  647. .END_JSRABS\@
  648.     ENDC
  649.     ENDM
  650.  
  651. JMPABS:MACRO
  652.     IFNE    NARG-1
  653.         FAIL    arguments "JMPABS"
  654.     ENDC
  655.  
  656.     IFD    WHDLOADSLAVE
  657. ;-------------------------------------
  658.     IFC    \1,'Display'
  659.     rts            ;ignore display
  660.     MEXIT
  661.     ENDC    
  662. ;-------------------------------------
  663.     IFC    \1,'NewLine'
  664.     rts            ;ignore newline
  665.     MEXIT
  666.     ENDC    
  667. ;-------------------------------------
  668.     IFC    \1,'LoadFiles'
  669.     rts            ;ignore LoadFiles (whdload uses preload)
  670.     MEXIT
  671.     ENDC    
  672. ;-------------------------------------
  673.     IFC    \1,'Degrade'
  674.     IFD    WHDM_DEGRADE_CALLED
  675.     FAIL    'Degrade called twice'
  676.     ENDC
  677. WHDM_DEGRADE_CALLED SET    1
  678.                 ;map Degrade on SetCACR
  679.     movem.l    d0-d1/a0-a2,-(A7)
  680.     move.l    _resload(PC),a2
  681.     and.l    #CACRF_EnableI|CACRF_EnableD,d0    ;mask bits allowed in whdload
  682.     and.l    #CACRF_EnableI|CACRF_EnableD,d1    ;mask bits allowed in whdload
  683.     jsr    (resload_SetCACR,a2)
  684.     movem.l    (A7)+,d0-d1/a0-a2
  685.     rts
  686.     MEXIT
  687.     ENDC    
  688. ;-------------------------------------
  689.     IFC    \1,'SupervisorMode'
  690.     IFD    WHDM_SUPERVISORMODE_CALLED
  691.     FAIL    'SupervisorMode called twice'
  692.     ENDC
  693. WHDM_SUPERVISORMODE_CALLED SET    1
  694.     rts            ;ignore SupervisorMode once
  695.     MEXIT
  696.     ENDC    
  697. ;-------------------------------------
  698.     IFC    \1,'SaveOSData'
  699.     IFD    WHDM_SAVEOSDATA_CALLED
  700.     FAIL    'SaveOSData called twice'
  701.     ENDC
  702. WHDM_SAVEOSDATA_CALLED SET    1
  703.     rts            ;ignore SaveOSData once
  704.     MEXIT
  705.     ENDC    
  706. ;-------------------------------------
  707.     IFC    \1,'SetLocalVarZone'
  708.     rts            ;ignored atm
  709.     MEXIT
  710.     ENDC    
  711. ;-------------------------------------
  712.     IFC    \1,'AllocExtMem'
  713.     IFD    WHDM_ALLOCEXTMEM_CALLED
  714.     FAIL    'AllocExtMem called twice'
  715.     ENDC
  716. WHDM_ALLOCEXTMEM_CALLED SET    1
  717.     cmp.l    #FASTMEMSIZE,D0
  718.     beq.s    .whdm_allocextmem1\@
  719.     illegal
  720. .whdm_allocextmem1\@
  721.     move.l    _whd_fmemaddr(PC),d0
  722.     rts
  723.     MEXIT
  724.     ENDC    
  725. ;-------------------------------------
  726.     IFC    \1,'CloseAll'
  727.     pea    TDREASON_DEBUG
  728.     move.l    (_resload,pc),-(a7)
  729.     add.l    #resload_Abort,(a7)
  730.     rts
  731.     MEXIT
  732.     ENDC    
  733. ;-------------------------------------
  734.     IFC    \1,'TestFile'
  735.     movem.l    d1/a0-a2,-(A7)
  736.     move.l    _resload(PC),a2
  737.     move.l    d0,a0
  738.     jsr    (resload_GetFileSize,a2)
  739.     movem.l    (A7)+,d1/a0-a2
  740.     tst.l    d0
  741.     bne.s    .whdm_testfile1\@
  742.     moveq.l    #-1,d0
  743.     bra.s    .whdm_testfile2\@
  744.  
  745. .whdm_testfile1\@
  746.     moveq.l    #0,d0
  747. .whdm_testfile2\@
  748.     rts
  749.     MEXIT
  750.     ENDC    
  751. ;-------------------------------------
  752.     IFC    \1,'LoadDisks'
  753.     rts            ;ignore loaddisks
  754.     MEXIT
  755.     ENDC
  756. ;-------------------------------------
  757.     IFC    \1,'WaitMouse'
  758. .waitmousem_\@
  759.     move.w    $dff006,$dff180
  760.     btst    #6,$bfe001
  761.     bne.s    .waitmousem_\@
  762.     rts
  763.     MEXIT
  764.     ENDC    
  765. ;-------------------------------------
  766.     IFC    \1,'WaitReturn'
  767. .waitmousem_\@
  768.     move.w    $dff006,$dff180
  769.     btst    #6,$bfe001
  770.     bne.s    .waitmousem_\@
  771.     rts
  772.     MEXIT
  773.     ENDC    
  774. ;-------------------------------------
  775.     FAIL    'JMPABS-WHDLOAD'
  776.     ELSE
  777.  
  778.     MOVE.L    AbsTable(PC),-(A7)
  779.     ADD.L    #AbsOff_\1,(A7)
  780.  
  781.     MOVE.L    A0,-(A7)
  782.     MOVE.L    4(A7),A0
  783.     MOVE.L    (A0),4(A7)
  784.  
  785.     MOVE.L    (A7)+,A0
  786.     RTS
  787.  
  788.     ENDC
  789.     ENDM
  790.  
  791. GO_SUPERVISOR:MACRO
  792.     JSRABS    SupervisorMode
  793.     ENDM
  794.  
  795. GO_USER:MACRO
  796.     JSRABS    UserMode
  797.     ENDM
  798.  
  799. SAVE_OSDATA:MACRO
  800.     IFLT    NARG-1
  801.         FAIL    arguments "SAVE_OSDATA"
  802.     ENDC
  803.  
  804.     IFGE    NARG-2
  805.         MOVEM.L    D0/A0,-(A7)
  806.         
  807.         MOVEQ    #0,D0
  808.         MOVE.B    \2,D0
  809.     
  810.         IFEQ    NARG-3
  811.             LEA    \3(PC),A0
  812.         ELSE
  813.             SUB.L    A0,A0
  814.         ENDIF
  815.         
  816.         JSRGEN    SetQuitKey
  817.  
  818.         MOVEM.L    (A7)+,D0/A0
  819.     ENDIF
  820.  
  821.     IFD    WHDLOADSLAVE
  822. _whd_chipused    SET    _whd_chipused+\1
  823. _saveosdata_tempvar\@    SET    CHIPMEMSIZE+FAKEFMEMSIZE
  824.     IFLT    _saveosdata_tempvar\@-_whd_chipused
  825.     FAIL    'Too few memory set in slave'
  826.     ENDC
  827.     ELSE
  828.  
  829. ;;    move.l    D0,-(sp)
  830.     move.l    #\1,D0
  831.     JSRABS    SaveOSData
  832. ;;    move.l    (sp)+,D0    ; stack changes anyway!
  833.                 ; Registers are zeroed too ;-) [Ralf]
  834.     ENDC        ;end whdload-jst
  835.     ENDM
  836.  
  837. ; obsolete now, but can be useful to load a data register
  838. ; with a relative address
  839.  
  840. GETUSRADDR:MACRO
  841.     IFNE    NARG-1
  842.         FAIL    arguments "PATCHUSRADDR"
  843.     ENDC
  844.     move.l    Ax,-(sp)
  845.     lea    \1(pc),Ax
  846.     move.l    Ax,D0
  847.     move.l    (sp)+,Ax
  848.     ENDM
  849.  
  850. GETGENADDR:MACRO
  851.     IFNE    NARG-1
  852.         FAIL    arguments "GETGENADDR"
  853.     ENDC
  854.     move.l    Ax,-(sp)
  855.     move.l    RelTable(pc),Ax
  856.     add.l    #RelOff_\1,Ax
  857.     move.l    (Ax),D0
  858.     move.l    (sp)+,Ax
  859.     ENDM
  860.  
  861. ; puts a RTS and notifies
  862.  
  863. PATCH_RTS:MACRO
  864.     IFNE    NARG-1
  865.         FAIL    arguments "PATCH_RTS"
  866.     ENDC
  867.  
  868.     REGISTER_PATCH    \1,#8    ; 6 bytes ahead to allow to find the pattern
  869.     move.w    #$4E75,\1
  870.     ENDM
  871.  
  872. ; puts a RTE and notifies
  873.  
  874. PATCH_RTE:MACRO
  875.     IFNE    NARG-1
  876.         FAIL    arguments "PATCH_RTE"
  877.     ENDC
  878.  
  879.     REGISTER_PATCH    \1,#8    ; 8 bytes ahead to allow to find the pattern
  880.     move.w    #$4E73,\1
  881.     ENDM
  882.  
  883. ; puts a NOP and notifies
  884.  
  885. PATCH_NOP:MACRO
  886.     IFNE    NARG-1
  887.         FAIL    arguments "PATCH_NOP"
  888.     ENDC
  889.  
  890.     REGISTER_PATCH    \1,#8    ; 8 bytes ahead to allow to find the pattern
  891.     move.w    #$4E71,\1
  892.     ENDM
  893.  
  894. ; puts 2 NOPs and notifies
  895.  
  896. PATCH_NOPNOP:MACRO
  897.     IFNE    NARG-1
  898.         FAIL    arguments "PATCH_NOPNOP"
  899.     ENDC
  900.  
  901.     REGISTER_PATCH    \1,#8    ; 8 bytes ahead to allow to find the pattern
  902.     move.l    #$4E714E71,\1
  903.     ENDM
  904.  
  905. ; allows to notify JST about a patch
  906. ; if PATCH_LOGGED is defined
  907.  
  908. REGISTER_PATCH:MACRO
  909.     IFNE    NARG-2
  910.         FAIL    arguments "REGISTER_PATCH"
  911.     ENDC
  912.  
  913.     IFD    PATCH_LOGGED
  914.     movem.l    D0-A0,-(A7)
  915.     lea    \1,A0
  916.     move.l    \2,D0
  917.     JSRGEN    LogPatch
  918.     movem.l    (A7)+,D0-A0
  919.     ENDC
  920.     ENDM
  921.  
  922. ; obsolete now
  923.  
  924. PATCHABSJMP:MACRO
  925.     PATCHUSRJMP    \1,\2
  926.     ENDM
  927.  
  928. ; obsolete now
  929.  
  930. PATCHABSJSR:MACRO
  931.     PATCHUSRJSR    \1,\2
  932.     ENDM
  933.  
  934.  
  935. PATCHUSRJMP:MACRO
  936.     IFNE    NARG-2
  937.         FAIL    arguments "PATCHUSRJMP"
  938.     ENDC
  939.     PATCHUSRXXX    \1,\2,$4EF9
  940.     ENDM
  941.  
  942. PATCHUSRJSR:MACRO
  943.     IFNE    NARG-2
  944.         FAIL    arguments "PATCHUSRJSR"
  945.     ENDC
  946.     PATCHUSRXXX    \1,\2,$4EB9
  947.     ENDM
  948.  
  949. PATCHGENJMP:MACRO
  950.     IFNE    NARG-2
  951.         FAIL    arguments "PATCHGENJMP"
  952.     ENDC
  953.     PATCHGENXXX    \1,\2,$4EF9
  954.     ENDM
  955.  
  956. PATCHGENJSR:MACRO
  957.     IFNE    NARG-2
  958.         FAIL    arguments "PATCHGENJSR"
  959.     ENDC
  960.     PATCHGENXXX    \1,\2,$4EB9
  961.     ENDM
  962.  
  963. PATCHUSRXXX:MACRO
  964.     REGISTER_PATCH    \1,#6
  965.  
  966.     movem.l    Ax/Ay,-(sp)
  967.     lea    \2(pc),Ax
  968.     lea    \1,Ay
  969.     move.w    #\3,(Ay)+
  970.     move.l    Ax,(Ay)
  971.     movem.l    (sp)+,Ax/Ay
  972.     ENDM
  973.  
  974. PATCHGENXXX:MACRO
  975.     REGISTER_PATCH    \1,#6
  976.  
  977.     movem.l    Ax/Ay,-(sp)
  978.  
  979.     move.l    RelTable(pc),Ax
  980.     add.l    #RelOff_\2,Ax
  981.     move.l    (Ax),Ax
  982.     lea    \1,Ay
  983.     move.w    #\3,(Ay)+
  984.     move.l    Ax,(Ay)
  985.  
  986.     movem.l    (sp)+,Ax/Ay
  987.     ENDM
  988.  
  989. TESTFILE:MACRO
  990.     IFNE    NARG-1
  991.         FAIL    arguments "TESTFILE"
  992.     ENDC
  993.     move.l    Ax,-(sp)
  994.     lea    \1(pc),Ax
  995.     move.l    Ax,D0
  996.     JSRABS    TestFile
  997.     move.l    (sp)+,Ax
  998.     ENDM
  999.  
  1000. HD_PARAMS:MACRO
  1001.     IFD    WHDLOADSLAVE
  1002.     IFLT    NARG-3
  1003.         FAIL    arguments "HD_PARAMS"
  1004.     ENDC
  1005.  
  1006. _whdinit_base
  1007.         SLAVE_HEADER        ;ws_Security + ws_ID
  1008.         dc.w    10        ;ws_Version
  1009.     IFND    WHDLOADSLAVEFLAGS
  1010.         dc.w    WHDLF_NoError|WHDLF_EmulTrap    ;ws_flags
  1011.     ELSE
  1012.         dc.w    WHDLF_NoError|WHDLF_EmulTrap|WHDLOADSLAVEFLAGS
  1013.     ENDC
  1014.         dc.l    CHIPMEMSIZE+FAKEFMEMSIZE ;ws_BaseMemSize
  1015.         dc.l    0        ;ws_ExecInstall
  1016.         dc.w    HDP_End-_whdinit_base    ;ws_GameLoader
  1017.         dc.w    0        ;ws_CurrentDir
  1018.         dc.w    0        ;ws_DontCache
  1019.         dc.b    $00        ;ws_keydebug = none
  1020. _whd_keyexit    dc.b    $5D        ;ws_keyexit = *
  1021. _whd_fmemaddr    DC.L    FASTMEMSIZE    ;fastmem
  1022.         dc.w    _whdi_name-_whdinit_base
  1023.         dc.w    _whdi_copyright-_whdinit_base
  1024.         dc.w    _whdi_installer-_whdinit_base
  1025.  
  1026.     IFGE    NARG-6
  1027. _whdi_name    dc.b    '\4',0    
  1028. _whdi_copyright    dc.b    '\5',0
  1029. _whdi_installer    dc.b    '\6',0
  1030.     ELSE
  1031. _whdi_name    dc.b    'UNKNOWN',0    
  1032. _whdi_copyright    dc.b    'UNKNOWN',0
  1033. _whdi_installer    dc.b    'UNKNOWN',0
  1034.     ENDC
  1035.     EVEN
  1036. HDP_FnameStart:
  1037.     IFD    MAXON_ASM
  1038.         DC.B    "\1"
  1039. HDP_FnameDiskNo    dc.b    0,0
  1040.     ELSE
  1041.         dc.b    \1
  1042. HDP_FnameDiskNo    dc.b    0,0            ; used for diskfiles
  1043.     ENDIF
  1044.     cnop    0,4
  1045. HDP_End:
  1046. ;function to init slave
  1047. ;atm only for loading regs in whdload as overgiven by jst
  1048.     lea    _resload(pc),a1
  1049.     move.l    a0,(a1)            ;save for later use
  1050.     bra.s    _whdinit_slave1
  1051.  
  1052. _resload    dc.l    0
  1053.  
  1054. _tags        dc.l    WHDLTAG_CUSTOM5_GET    ;trainer
  1055. _whdi_custom5    dc.l    0
  1056.         dc.l    WHDLTAG_CUSTOM4_GET    ;joypad
  1057. _whdi_custom4    dc.l    0
  1058.         dc.l    WHDLTAG_BUTTONWAIT_GET    ;buttonwait
  1059. _whdi_buttonwait dc.l    0
  1060.         dc.l    0
  1061.  
  1062. _whdinit_slave1
  1063.     ;get tags
  1064.     lea    (_tags,pc),a0
  1065.     move.l    _resload(PC),a2
  1066.     jsr    (resload_Control,a2)
  1067.  
  1068.  
  1069.     move.l    _whdi_custom5(PC),d0
  1070.     moveq.l    #0,d1
  1071.     move.l    _whdi_custom4(PC),d2
  1072.     moveq.l    #0,d3
  1073.     move.l    _whdi_buttonwait(PC),d4
  1074.     moveq.l    #0,d5
  1075.  
  1076. _whd_chipused    set    0    ;needed for verification of memoryroutines
  1077. _whd_fastused    set    0
  1078. _whd_fakefused    set    0
  1079.  
  1080.     ELSE
  1081.  
  1082.     IFLT    NARG-3
  1083.         FAIL    arguments "HD_PARAMS"
  1084.     ENDC
  1085. HDP_Start:
  1086.     dc.l    $70004E75            ; 00 if the user tries to start the loader
  1087.     dc.b    "JOTD"                ; 04 magic number
  1088.     dc.l    CURRENT_VERSION_ID        ; 09 version of JST identifier
  1089. AbsTable:
  1090.     dc.l    0                ; 0C pointer on general absolute table
  1091. RelTable:
  1092.     dc.l    0                ; 10 pointer on general relocate table
  1093.     dc.l    \2                ; 14 diskfile size
  1094.     dc.l    \3                ; 18 number of disks
  1095.     dc.l    HDP_End-HDP_Start        ; 1C entrypoint offset
  1096.     dc.l    HDP_FnameStart-HDP_Start    ; 20 offset of fname
  1097. _SysBase:
  1098.     dc.l    0                ; 24 sysbase
  1099. _DosBase:
  1100.     dc.l    0                ; 28 dosbase
  1101.  
  1102. HDP_FnameStart:
  1103.     IFD    MAXON_ASM
  1104.         DC.B    "\1",0
  1105.     ELSE
  1106.         dc.b    \1,0                ; used for diskfiles
  1107.     ENDIF
  1108.     cnop    0,4
  1109. HDP_End:
  1110.     ; start of the loader
  1111.     ; initialize patch zone if PATCH_LOGGED set
  1112.  
  1113.     IFD    PATCH_LOGGED
  1114.     JSRABS    InitLogPatch
  1115.     ENDC
  1116.     ENDC    ;ENDC jst/whdload
  1117.     ENDM
  1118.  
  1119. ; if hardware not already defined, do it
  1120.  
  1121.     IFND    dmacon
  1122.  
  1123.     include    "hardware/custom.i"
  1124.  
  1125.     ENDC
  1126.  
  1127. ; copied caches flag from execbase.i to avoid including
  1128. ; system libs only for those ones
  1129.  
  1130.     IFND    CACRF_EnableI
  1131.  
  1132. CACRF_EnableI    EQU    (1<<0)  ; Enable instruction cache
  1133. CACRF_FreezeI    EQU    (1<<1)  ; Freeze instruction cache
  1134. CACRF_ClearI    EQU    (1<<3)  ; Clear instruction cache 
  1135. CACRF_IBE    EQU    (1<<4)  ; Instruction burst enable
  1136. CACRF_EnableD    EQU    (1<<8)  ; 68030 Enable data cache 
  1137. CACRF_FreezeD    EQU    (1<<9)  ; 68030 Freeze data cache 
  1138. CACRF_ClearD    EQU    (1<<11) ; 68030 Clear data cache    
  1139. CACRF_DBE    EQU    (1<<12) ; 68030 Data burst enable
  1140. CACRF_WriteAllocate EQU (1<<13) ; 68030 Write-Allocate mode
  1141. CACRF_EnableE    EQU    (1<<30) ; Master enable for external caches
  1142.                  ; External caches should track the
  1143.                  ; state of the internal caches
  1144.                  ; such that they do not cache anything
  1145.                  ; that the internal cache turned off; for.
  1146. CACRF_CopyBack    EQU    (1<<31) ; Master enable for copyback caches
  1147.     ENDC
  1148.     ENDC
  1149.